📅 2021. 04. 30

🙍♂️ 박서진님 - https://github.com/raon0211
웹 서비스에서 가장 다루기 어려운 부분은? 비동기 프로그래밍
👎 읽기 어려운 코드의 특징
'성공하는 경우'와 '실패하는 경우'가 섞여있음 -> 함수의 크기가 커져 비즈니스 로직이 파악이 어려워짐
👍 읽기 쉬운 코드의 특징
try, catch 안에 async, await를 넣어서 처리하는 케이스가 대표적
컴포넌트에서 로딩과 에러 처리를 동시에 수행함
하나의 비동기 작업은 로딩, 에러, 완료 3가지의 상태를 가짐. 만약 2개의 비동기 작업을 요청하는 경우 9가지의 상태를 가짐.

-> 비동기 작업이 많아질수록 복잡성이 늘어남 😭

-> try, catch 구문과 거의 유사한 구조를 가지고 있는 모습을 확인할 수 있음
Recoil에선 Async Selector를 사용,
SWR, React Query에선 {suspense: true}를 사용하면 자동으로 컴포넌트의 suspense 상태가 관리됨
🙍♂️ 이한님 - https://github.com/hahnlee
페이지 로딩 2초 이내 로드시 이탈율 9%, 5초 초과시 이탈율 38%
바이트별로 보면, 자바스크립트는 같은 크기의 이미지나 웹폰트보다 브라우저가 처리하는 비용이 많이 듭니다. - Tom Dale
JavaScript는 파일을 다운로드한 후 파싱, 컴파일, 실행까지 여러 단계를 거치기 때문에 같은 용량이더라도 처리비용이 높음. 따라서 번들 최적화가 아주 중요함.
1. ✨ 원인 찾기 - Webpack Bundle Analyzer 추천
용량이 큰 라이브러리는 더 가벼운 라이브러리로 대체하고 용도가 겹치는 라이브러리는 하나의 라이브러리로 통일하자.
2. ✨ 라이브러리 중복 줄이기
같은 라이브러리지만 버전이 다른 경우가 존재 (Dependency conflict) 패키지 매니저마다 이 문제를 다양한 방식으로 해결
2-1. npm은 어떻게 Dependency conflict를 해결했나
npm은 tree 구조로 필요한 버전을 모두 다운로드함
-> 디펜던시를 작성자가 의도한 버전대로 동작하는 효과
-> but, 번들 사이즈와 node_modules 용량이 커짐
npm은 node_modules 용량이 과도하게 커지는 문제를 해결하기 위해 더 높은 버전을 사용
-> 라이브러리들이 semver를 지킨다고 가정하기 때문에 메이저 버전이 바뀌지 않는 한 문제가 없다고 판단
npm dedupe: 중복된 모듈을 줄일 수 있는 명령어
-> 중복된 라이브러리의 버전을 확인하고 적합한 버전으로 통합
2-2. yarn은 어떻게 Dependency conflict를 해결했나
The dedupe command isn’t necessary. yarn install will already dedupe.
이미 yarn install이 dedupe을 알아서 한다고 함. 근데 완벽하지 않음. 😅
yarn-deduplicate 라이브러리를 사용해서 중복된 라이브러리 제거를 추천.
2-3. yarn2는 npm처럼 yarn dedupe을 지원함
2-4. 라이브러리 중복의 쉬운 예시는 lodash가 있음
lodash의 문제는 cjs 버전의 lodash, esm 버전의 lodash-es, 단독 라이브러리 형태의 lodash.get 등 같은 패키지가 여러 패키지로 존재
-> 프로젝트에서 lodash 패키지 하나만 쓰고 있더라도 디펜던시 때문에 여러개의 lodash가 설치될수 있음.
webpack의 alias 옵션으로 해결가능
3. ✨ 필요한 라이브러리만 불러오기
위의 코드는 아래와 같이 변환됨.
-> merge 함수 하나를 위해 lodash 전체를 로드함 😱
이렇게 필요한 라이브러리만 불러오면 용량을 줄일 수 있다.
...언제 다 바꾸죠? 😫
babel-plugin-transform-imports 사용하면 트랜스파일러가 알아서 바꿔줌!
4. ✨ 더 가벼운 라이브러리 사용하기
lodash의 groupBy는 함수 하나가 무려 6kb. shorthands 표현, 캐싱등을 지원하기 때문. -> 직접 구현하자
node-rsa는 Node.js용으로 만들어진 라이브러리라서 crypto, Buffer, Big Number등의 polyfill 용량만 100kb 😱 -> webpack 설정으로 끄자
🙍♀️ 진유림님 - https://github.com/milooy/
"그 코드는 안 건드리시는게 좋을 거에요. 일단 제가 만질게요. ^^;;" -> 동료에게 물어봐야 알수 있는 코드는 개발 병목과 유지보수 시간을 연장시킴
실무에서 클린코드의 의의 = 유지보수 시간의 단축
-> 코드 파악, 디버깅, 리뷰 시간을 단축시킴
하나의 목적을 가진 코드가 흩뿌려져 있어요
-> 같은 목적의 코드는 뭉쳐두자
뭉치면 쾌적한 코드와 답답한 코드 구분하기
클린 코드는 짧은 코드가 아니라 찾고 싶은 로직을 빠르게 찾을 수 있는 코드
함수가 여러가지 일을 하고 있어요
-> 하나의 일을 하는 뚜렷한 이름의 함수를 만들자
함수의 세부구현 단계가 제각각이에요
-> 핵심 개념을 뽑아내자


🙍♂️ 조유성님 - https://github.com/g6123
25개의 서비스는 서로 다른 webpack entrypoint를 가지지만, 하나의 package.json에서 빌드를 함. 이는 다음과 같은 문제가 생김.
패키지 하나 업데이트 했을 뿐인데 25개 서비스 중 일부 서비스에서 에러가 뿜뿜해버림


코드 한 줄만 수정해도 모든 빌드를 새로 해야함




패키지를 세 가지로 분리하여 구성

"Zero-Build" -> 소스 코드가 바뀐 패키지만 빌드하고 나머지는 기존 빌드 결과물을 재사용하기!
Git 커밋 해쉬 비교

Git 저장소에 gzip으로 압축해서 저장

결과적으로 빌드 속도가 최대 15배 향상함
